{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 评估是检验语言模型回答质量的关键环节。\n",
    "#### 通常评估包含两个目的：\n",
    "- 检验LLM应用是否达到了验收标准。\n",
    "- 分析改动对于LLM应用性能的影响\n",
    "\n",
    "基本思路是利用语言模型本身或链本身，来辅助评估其他的语言模型、链和应用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 创建LLM应用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检索QA链，在文档上进行检索\n",
    "from langchain.chains import RetrievalQA\n",
    "# openAi模型\n",
    "from langchain.chat_models.tongyi import ChatTongyi\n",
    "# 文档加载器\n",
    "from langchain.document_loaders import JSONLoader\n",
    "# 向量存储索引创建器\n",
    "from langchain.indexes import VectorstoreIndexCreator\n",
    "# 向量存储\n",
    "from langchain.vectorstores import DocArrayInMemorySearch\n",
    "# Qwen embedding 类\n",
    "from langchain.embeddings import DashScopeEmbeddings\n",
    "# 加载环境变量\n",
    "from dotenv import load_dotenv\n",
    "\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载数据集\n",
    "loader = JSONLoader(\"../data/ruozhiba_raw.json\",\n",
    "                  jq_schema='.[] | {combined: (.instruction + \"\\n\" + .output)}',\n",
    "                  text_content=False,\n",
    "                  content_key=\"combined\")\n",
    "data = loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Document(metadata={'source': '/home/debian/code/AIAgent_learning/Langchain-learning/data/ruozhiba_raw.json', 'seq_num': 1}, page_content='天下没有不散的筵席，那么我们相聚的意义又是什么\\n尽管我们相聚的时光有限，但是相聚的意义在于创造美好的回忆和珍贵的关系。相聚让我们感受到彼此的关怀、支持和友情。我们可以一起分享喜悦、快乐和困难，互相支持和激励。相聚也可以是一个机会，让我们相互了解、学习和成长。最重要的是，相聚能够带给我们真实的人际交往和情感交流，让我们感受到生活的丰富和美好。所以，即使相聚的时间有限，我们仍然要珍惜这份意义和与彼此相聚的时光。')"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载api_key\n",
    "load_dotenv()\n",
    "api_key = os.environ.get(\"DASHSCOPE_API_KEY\")\n",
    "# embedding 模型\n",
    "embedding = DashScopeEmbeddings(dashscope_api_key=api_key)\n",
    "# 将指定向量存储类，创建完成后，我们将从加载器中调用，通过文档加载器列表加载\n",
    "index = VectorstoreIndexCreator(vectorstore_cls=DocArrayInMemorySearch, embedding=embedding).from_loaders([loader])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 通过指定语言模型、链类型、检索器和我们要打印的详细程度来创建检索QA链\n",
    "llm = ChatTongyi(api_key=api_key,model=\"qwen-flash\")\n",
    "qa = RetrievalQA.from_chain_type(\n",
    "    llm =llm,\n",
    "    chain_type=\"stuff\",\n",
    "    retriever = index.vectorstore.as_retriever(),\n",
    "    verbose = True,\n",
    "    chain_type_kwargs = {\"document_separator\":\"<<<<>>>>\"}\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "天下没有不散的筵席，那么我们相聚的意义又是什么\n",
      "尽管我们相聚的时光有限，但是相聚的意义在于创造美好的回忆和珍贵的关系。相聚让我们感受到彼此的关怀、支持和友情。我们可以一起分享喜悦、快乐和困难，互相支持和激励。相聚也可以是一个机会，让我们相互了解、学习和成长。最重要的是，相聚能够带给我们真实的人际交往和情感交流，让我们感受到生活的丰富和美好。所以，即使相聚的时间有限，我们仍然要珍惜这份意义和与彼此相聚的时光。\n"
     ]
    }
   ],
   "source": [
    "print(data[0].page_content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "咖啡严格来说是不是也可以叫豆浆？\n",
      "不，咖啡和豆浆是两种完全不同的饮品，它们的制作过程和成分都不同。\n",
      "\n",
      "咖啡是一种由咖啡豆经过研磨和冲泡得到的饮品。咖啡豆是咖啡植物的种子，经过烘焙后变得具有特殊的香气和味道。咖啡通常带有苦味和咖啡因，而且具有提神醒脑的作用。常见的咖啡种类有美式咖啡、拿铁、卡布奇诺等。\n",
      "\n",
      "豆浆是一种由黄豆经过浸泡、研磨和过滤得到的植物性饮品。豆浆是将黄豆磨成浆状，然后过滤掉固体渣滓，保留液体部分。豆浆一般没有咖啡的苦味和咖啡因，它是一种富含植物蛋白质的饮品，适合素食者或对乳制品过敏的人饮用。\n",
      "\n",
      "虽然咖啡和豆浆都是由豆类制成，但它们的制作过程、味道和功能都有明显的差异，因此咖啡不能被称为豆浆。\n"
     ]
    }
   ],
   "source": [
    "print(data[1].page_content)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 手动创建测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "examples = [\n",
    "    {\n",
    "        \"query\":\"我们相聚的意义是什么？\",\n",
    "        \"answer\":\"相聚的意义在于创造美好的回忆和珍贵的关系\"\n",
    "    },\n",
    "    {\n",
    "        \"query\":\"咖啡是不是也可以叫豆浆?\",\n",
    "        \"answer\":\"它们的制作过程、味道和功能都有明显的差异，因此咖啡不能被称为豆浆。\"\n",
    "\n",
    "    }\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过LLM生成测试用例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入QA生成链，它将接收文档，并从每个文档中创建一个问题答案对\n",
    "from langchain.evaluation.qa import QAGenerateChain\n",
    "\n",
    "from langchain.output_parsers.regex import RegexParser\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.base_language import BaseLanguageModel\n",
    "from typing import Any"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "template = \"\"\"You are a teacher coming up with questions to ask on a quiz. \n",
    "    Given the following document, please generate a question and answer based on that \n",
    "    document.\n",
    "    Example Format:\n",
    "    <Begin Document>\n",
    "    ...\n",
    "    <End Document>\n",
    "    QUESTION: question here\n",
    "    ANSWER: answer here\n",
    "\n",
    "    These questions should be detailed and be based explicitly on information in the \n",
    "    document. Begin!\n",
    "\n",
    "    <Begin Document>\n",
    "    {doc}\n",
    "    <End Document>\n",
    "    请使用中文输出\n",
    "    \"\"\"\n",
    "output_parser = RegexParser(regex=r\"QUESTION: (.*?)\\nANSWER: (.*)\",output_keys=[\"query\",\"answer\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "PROMPT = PromptTemplate(input_variables=[\"doc\"], template=template, output_parser=output_parser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PromptTemplate(input_variables=['doc'], input_types={}, output_parser=RegexParser(regex='QUESTION: (.*?)\\\\nANSWER: (.*)', output_keys=['query', 'answer']), partial_variables={}, template='You are a teacher coming up with questions to ask on a quiz. \\n    Given the following document, please generate a question and answer based on that \\n    document.\\n    Example Format:\\n    <Begin Document>\\n    ...\\n    <End Document>\\n    QUESTION: question here\\n    ANSWER: answer here\\n\\n    These questions should be detailed and be based explicitly on information in the \\n    document. Begin!\\n\\n    <Begin Document>\\n    {doc}\\n    <End Document>\\n    请使用中文输出\\n    ')"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PROMPT"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ChineseQAGenerationChain(QAGenerateChain):\n",
    "    @classmethod\n",
    "    def from_llm(cls, llm:BaseLanguageModel, **kwargs:Any) -> QAGenerateChain:\n",
    "        return cls(llm=llm, prompt=PROMPT, **kwargs)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "example_gen_chain = ChineseQAGenerationChain.from_llm(llm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_examples = example_gen_chain.apply([{\"doc\":t} for t in data[:5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'qa_pairs': {'query': '根据文档内容，为什么即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光？请从多个方面详细说明。',\n",
       "   'answer': '即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光，原因如下：首先，相聚的意义在于创造美好的回忆和建立珍贵的关系；其次，相聚让我们感受到彼此的关怀、支持和友情；再次，相聚提供了分享喜悦、快乐和困难的机会，使我们能够在生活中互相支持和激励；此外，相聚也是一个促进相互了解、学习和成长的重要契机；最后，也是最重要的，相聚能带来真实的人际交往和情感交流，使我们深刻体会到生活的丰富与美好。因此，无论时间长短，我们都应珍视相聚的每一刻。'}},\n",
       " {'qa_pairs': {'query': '为什么咖啡不能被称为豆浆？请从制作过程、成分、味道和功能四个方面进行详细说明。  ',\n",
       "   'answer': '咖啡不能被称为豆浆，原因如下：首先，在制作过程上，咖啡是将咖啡豆研磨后通过冲泡方式提取出的饮品，而豆浆则是将黄豆浸泡后研磨并过滤掉固体渣滓所得到的植物性液体；其次，在成分方面，咖啡含有咖啡因，具有提神醒脑的作用，而豆浆不含咖啡因，富含植物蛋白质；再次，在味道上，咖啡通常带有明显的苦味，而豆浆味道较为清淡，带有豆类的天然香气；最后，在功能上，咖啡主要用于提神和提供能量，而豆浆则是一种适合素食者或乳制品过敏者的营养替代饮品。因此，尽管两者都由豆类制成，但在制作工艺、化学成分、口感体验和生理功能上均有显著差异，故咖啡不能被称为豆浆。'}},\n",
       " {'qa_pairs': {'query': '为什么石油虽然也是一种油，但不能用于炒菜？请从化学成分、毒性、风味气味以及燃点四个方面进行详细解释。  ',\n",
       "   'answer': '石油不能用于炒菜，主要原因如下：第一，化学成分不同，食用油主要由植物或动物脂肪制成，富含对人体有益的脂肪酸（如欧米伽脂肪酸），而石油是化石燃料，主要成分为碳氢化合物，并含有多种有害化学物质；第二，石油具有毒性，其中含有的化学物质对人体有害，甚至可能致癌，且在加热时会释放有毒烟雾和蒸气，严重危害健康；第三，石油具有强烈且令人不悦的气味和味道，无法为食物增添美味，反而会污染食物；第四，石油的燃点远低于食用油，在较低温度下就容易燃烧，这在厨房环境中极易引发火灾，存在极大的安全隐患。因此，出于健康和安全的考虑，石油绝不能用于烹饪，只有专门设计的食用油才适合用于食品加工。'}},\n",
       " {'qa_pairs': {'query': '冥婚作为一种中国传统习俗，其性质为何具有矛盾性？请结合文档内容，从仪式形式与实际意义两个方面进行解释，并说明在不同地区人们对冥婚的看待方式有何差异。',\n",
       "   'answer': '冥婚的性质具有矛盾性，主要体现在其仪式形式与实际意义之间的冲突。从仪式形式上看，冥婚是一种婚礼，具有传统婚礼的特征，如举行仪式、交换信物等，因此表面上与“红事”相关联，属于喜庆的范畴。然而，从实际意义来看，冥婚的对象是已故的未婚男女，其目的是为了使死者的灵魂在阴间有伴侣相伴，以求得安宁，这显然与死亡相关，因而又与“白事”紧密相连。因此，冥婚在本质上兼具“红事”的仪式形式和“白事”的哀悼目的。'}},\n",
       " {'qa_pairs': {'query': '根据文档内容，当事人在执行死刑时是否可以委托律师作为代理人参与执行过程？请结合民法典的相关规定和刑事执行程序的特殊性进行解释。  ',\n",
       "   'answer': '根据文档内容，当事人在执行死刑时不可以委托律师或其他代理人参与执行过程。虽然《民法典》规定当事人可以委托一至二人作为代理人，但这种代理关系仅适用于民事事务，如合同签订、财产管理、民事诉讼等。而执行死刑属于刑事执行程序，具有高度的严肃性和国家强制性，由国家授权的专门机关依法进行，不允许私人代理参与。因此，即使当事人委托律师，也无法在死刑执行环节中代表其到场或代为执行，因为该程序不适用民法典中关于代理的规定。'}}]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_examples"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 整合测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "examples += [ v for item in new_examples for k,v in item.items()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'query': '我们相聚的意义是什么？', 'answer': '相聚的意义在于创造美好的回忆和珍贵的关系'},\n",
       " {'query': '咖啡是不是也可以叫豆浆?', 'answer': ''},\n",
       " {'query': '根据文档内容，为什么即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光？请从多个方面详细说明。',\n",
       "  'answer': '即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光，原因如下：首先，相聚的意义在于创造美好的回忆和建立珍贵的关系；其次，相聚让我们感受到彼此的关怀、支持和友情；再次，相聚提供了分享喜悦、快乐和困难的机会，使我们能够在生活中互相支持和激励；此外，相聚也是一个促进相互了解、学习和成长的重要契机；最后，也是最重要的，相聚能带来真实的人际交往和情感交流，使我们深刻体会到生活的丰富与美好。因此，无论时间长短，我们都应珍视相聚的每一刻。'},\n",
       " {'query': '为什么咖啡不能被称为豆浆？请从制作过程、成分、味道和功能四个方面进行详细说明。  ',\n",
       "  'answer': '咖啡不能被称为豆浆，原因如下：首先，在制作过程上，咖啡是将咖啡豆研磨后通过冲泡方式提取出的饮品，而豆浆则是将黄豆浸泡后研磨并过滤掉固体渣滓所得到的植物性液体；其次，在成分方面，咖啡含有咖啡因，具有提神醒脑的作用，而豆浆不含咖啡因，富含植物蛋白质；再次，在味道上，咖啡通常带有明显的苦味，而豆浆味道较为清淡，带有豆类的天然香气；最后，在功能上，咖啡主要用于提神和提供能量，而豆浆则是一种适合素食者或乳制品过敏者的营养替代饮品。因此，尽管两者都由豆类制成，但在制作工艺、化学成分、口感体验和生理功能上均有显著差异，故咖啡不能被称为豆浆。'},\n",
       " {'query': '为什么石油虽然也是一种油，但不能用于炒菜？请从化学成分、毒性、风味气味以及燃点四个方面进行详细解释。  ',\n",
       "  'answer': '石油不能用于炒菜，主要原因如下：第一，化学成分不同，食用油主要由植物或动物脂肪制成，富含对人体有益的脂肪酸（如欧米伽脂肪酸），而石油是化石燃料，主要成分为碳氢化合物，并含有多种有害化学物质；第二，石油具有毒性，其中含有的化学物质对人体有害，甚至可能致癌，且在加热时会释放有毒烟雾和蒸气，严重危害健康；第三，石油具有强烈且令人不悦的气味和味道，无法为食物增添美味，反而会污染食物；第四，石油的燃点远低于食用油，在较低温度下就容易燃烧，这在厨房环境中极易引发火灾，存在极大的安全隐患。因此，出于健康和安全的考虑，石油绝不能用于烹饪，只有专门设计的食用油才适合用于食品加工。'},\n",
       " {'query': '冥婚作为一种中国传统习俗，其性质为何具有矛盾性？请结合文档内容，从仪式形式与实际意义两个方面进行解释，并说明在不同地区人们对冥婚的看待方式有何差异。',\n",
       "  'answer': '冥婚的性质具有矛盾性，主要体现在其仪式形式与实际意义之间的冲突。从仪式形式上看，冥婚是一种婚礼，具有传统婚礼的特征，如举行仪式、交换信物等，因此表面上与“红事”相关联，属于喜庆的范畴。然而，从实际意义来看，冥婚的对象是已故的未婚男女，其目的是为了使死者的灵魂在阴间有伴侣相伴，以求得安宁，这显然与死亡相关，因而又与“白事”紧密相连。因此，冥婚在本质上兼具“红事”的仪式形式和“白事”的哀悼目的。'},\n",
       " {'query': '根据文档内容，当事人在执行死刑时是否可以委托律师作为代理人参与执行过程？请结合民法典的相关规定和刑事执行程序的特殊性进行解释。  ',\n",
       "  'answer': '根据文档内容，当事人在执行死刑时不可以委托律师或其他代理人参与执行过程。虽然《民法典》规定当事人可以委托一至二人作为代理人，但这种代理关系仅适用于民事事务，如合同签订、财产管理、民事诉讼等。而执行死刑属于刑事执行程序，具有高度的严肃性和国家强制性，由国家授权的专门机关依法进行，不允许私人代理参与。因此，即使当事人委托律师，也无法在死刑执行环节中代表其到场或代为执行，因为该程序不适用民法典中关于代理的规定。'}]"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "examples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，并在彼此的陪伴中感受到关怀、支持与温暖。短暂的相聚虽无法永恒，却能带来真实的情感交流与心灵共鸣。在共同经历喜悦、面对困难的过程中，我们互相激励、理解与成长。相聚不仅让我们体会到人与人之间最纯粹的关系，也赋予生活以温度和意义。正因时光有限，才更值得珍惜每一次相遇，让爱与联结成为生命中最珍贵的部分。'"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qa.run(examples[0][\"query\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "import langchain\n",
    "langchain.debug = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[32;1m\u001b[1;3m[chain/start]\u001b[0m \u001b[1m[chain:RetrievalQA] Entering Chain run with input:\n",
      "\u001b[0m{\n",
      "  \"query\": \"我们相聚的意义是什么？\"\n",
      "}\n",
      "\u001b[32;1m\u001b[1;3m[chain/start]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain] Entering Chain run with input:\n",
      "\u001b[0m[inputs]\n",
      "\u001b[32;1m\u001b[1;3m[chain/start]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain > chain:LLMChain] Entering Chain run with input:\n",
      "\u001b[0m{\n",
      "  \"question\": \"我们相聚的意义是什么？\",\n",
      "  \"context\": \"天下没有不散的筵席，那么我们相聚的意义又是什么\\n尽管我们相聚的时光有限，但是相聚的意义在于创造美好的回忆和珍贵的关系。相聚让我们感受到彼此的关怀、支持和友情。我们可以一起分享喜悦、快乐和困难，互相支持和激励。相聚也可以是一个机会，让我们相互了解、学习和成长。最重要的是，相聚能够带给我们真实的人际交往和情感交流，让我们感受到生活的丰富和美好。所以，即使相聚的时间有限，我们仍然要珍惜这份意义和与彼此相聚的时光。<<<<>>>>当我看到脚下先辈们铺好的路，才发觉人生的意义是为后人铺路。\\n这是一个深刻的领悟，表达了对前辈们的尊敬和对于生命意义的深刻理解。意识到自己的生命可以与前人的努力和奉献相连接，为后人铺设道路，这种认知通常引发对于责任、传承、奉献和社会价值的思考。\\n\\n这一领悟也呼应了社会中许多文化和道德的核心价值观，即个体的生命不是孤立存在的，而是与社会、家庭、文化和历史紧密相连。通过在自己的生命中为他人和社会做出积极的贡献，人们可以感受到更深层次的满足感和生命的意义。\\n\\n这种认识可以激发人们更积极地为社会做贡献，为他人铺设更宽广的道路，创造更美好的未来。同时，它也使个体更深刻地理解到生活中的连接和相互关系，推动人们更加关心社会、珍惜人际关系，形成更有温暖和积极向上的生活态度。<<<<>>>>人离开钱废人一个，钱离开人废纸一张。那为什么是人拼命挣钱而不是钱拼命找人呢。\\n这句话反映了在社会和生活中，人们通常会花费大量时间和精力去追逐金钱和财富，但一旦失去了金钱，人们往往陷入困境。这并不意味着钱对人类来说比人更重要，而是因为在现代社会，金钱通常被视为获取生活所需、提高生活质量、获得社会地位和满足自己需求的主要手段之一。\\n\\n人们努力挣钱可能是因为金钱能够提供稳定和舒适的生活，它代表着购买力和资源，可以用来满足人们的物质和经济需求。失去金钱可能导致生活中的困难，因为缺乏金钱可能意味着无法满足基本需求、失去生活稳定性和面临经济上的挑战。\\n\\n相比之下，金钱并不具备人类的情感、社交关系、家庭联系或其他非物质价值。因此，尽管金钱对于满足物质需求至关重要，但在生活中的其他方面，人与人之间的关系和情感支持同样至关重要。<<<<>>>>明明是我们走向死亡的道路，却被叫做人生\\n这是一种对生命的深刻思考，人们对生死、存在和生活意义的理解因个体和文化背景而有所不同。\\\"人生\\\"这个词汇通常指的是一个人在世上度过的时间，涵盖了各种经历、感受和活动。\\n\\n尽管生命的终结是不可避免的现实，但对于许多人来说，人生也可以是充满意义、成就和关系的旅程。生命的有限性赋予了人们对时间的珍惜，激发了对于追求幸福、建立联系、实现目标的渴望。\\n\\n这样的思考也体现了对人生意义的追问，这是一个哲学、宗教和文学等领域一直在讨论的主题。每个人对于这个问题的回答都可能因其独特的经历和信仰而有所不同。\"\n",
      "}\n",
      "\u001b[32;1m\u001b[1;3m[llm/start]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain > chain:LLMChain > llm:ChatTongyi] Entering LLM run with input:\n",
      "\u001b[0m{\n",
      "  \"prompts\": [\n",
      "    \"System: Use the following pieces of context to answer the user's question.\\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\\n----------------\\n天下没有不散的筵席，那么我们相聚的意义又是什么\\n尽管我们相聚的时光有限，但是相聚的意义在于创造美好的回忆和珍贵的关系。相聚让我们感受到彼此的关怀、支持和友情。我们可以一起分享喜悦、快乐和困难，互相支持和激励。相聚也可以是一个机会，让我们相互了解、学习和成长。最重要的是，相聚能够带给我们真实的人际交往和情感交流，让我们感受到生活的丰富和美好。所以，即使相聚的时间有限，我们仍然要珍惜这份意义和与彼此相聚的时光。<<<<>>>>当我看到脚下先辈们铺好的路，才发觉人生的意义是为后人铺路。\\n这是一个深刻的领悟，表达了对前辈们的尊敬和对于生命意义的深刻理解。意识到自己的生命可以与前人的努力和奉献相连接，为后人铺设道路，这种认知通常引发对于责任、传承、奉献和社会价值的思考。\\n\\n这一领悟也呼应了社会中许多文化和道德的核心价值观，即个体的生命不是孤立存在的，而是与社会、家庭、文化和历史紧密相连。通过在自己的生命中为他人和社会做出积极的贡献，人们可以感受到更深层次的满足感和生命的意义。\\n\\n这种认识可以激发人们更积极地为社会做贡献，为他人铺设更宽广的道路，创造更美好的未来。同时，它也使个体更深刻地理解到生活中的连接和相互关系，推动人们更加关心社会、珍惜人际关系，形成更有温暖和积极向上的生活态度。<<<<>>>>人离开钱废人一个，钱离开人废纸一张。那为什么是人拼命挣钱而不是钱拼命找人呢。\\n这句话反映了在社会和生活中，人们通常会花费大量时间和精力去追逐金钱和财富，但一旦失去了金钱，人们往往陷入困境。这并不意味着钱对人类来说比人更重要，而是因为在现代社会，金钱通常被视为获取生活所需、提高生活质量、获得社会地位和满足自己需求的主要手段之一。\\n\\n人们努力挣钱可能是因为金钱能够提供稳定和舒适的生活，它代表着购买力和资源，可以用来满足人们的物质和经济需求。失去金钱可能导致生活中的困难，因为缺乏金钱可能意味着无法满足基本需求、失去生活稳定性和面临经济上的挑战。\\n\\n相比之下，金钱并不具备人类的情感、社交关系、家庭联系或其他非物质价值。因此，尽管金钱对于满足物质需求至关重要，但在生活中的其他方面，人与人之间的关系和情感支持同样至关重要。<<<<>>>>明明是我们走向死亡的道路，却被叫做人生\\n这是一种对生命的深刻思考，人们对生死、存在和生活意义的理解因个体和文化背景而有所不同。\\\"人生\\\"这个词汇通常指的是一个人在世上度过的时间，涵盖了各种经历、感受和活动。\\n\\n尽管生命的终结是不可避免的现实，但对于许多人来说，人生也可以是充满意义、成就和关系的旅程。生命的有限性赋予了人们对时间的珍惜，激发了对于追求幸福、建立联系、实现目标的渴望。\\n\\n这样的思考也体现了对人生意义的追问，这是一个哲学、宗教和文学等领域一直在讨论的主题。每个人对于这个问题的回答都可能因其独特的经历和信仰而有所不同。\\nHuman: 我们相聚的意义是什么？\"\n",
      "  ]\n",
      "}\n",
      "\u001b[36;1m\u001b[1;3m[llm/end]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain > chain:LLMChain > llm:ChatTongyi] [1.33s] Exiting LLM run with output:\n",
      "\u001b[0m{\n",
      "  \"generations\": [\n",
      "    [\n",
      "      {\n",
      "        \"text\": \"我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。\",\n",
      "        \"generation_info\": {\n",
      "          \"finish_reason\": \"stop\",\n",
      "          \"request_id\": \"13ebf016-61fd-45ea-815d-29c10bbad905\",\n",
      "          \"token_usage\": {\n",
      "            \"input_tokens\": 696,\n",
      "            \"output_tokens\": 106,\n",
      "            \"cached_tokens\": 0,\n",
      "            \"total_tokens\": 802\n",
      "          }\n",
      "        },\n",
      "        \"type\": \"ChatGeneration\",\n",
      "        \"message\": {\n",
      "          \"lc\": 1,\n",
      "          \"type\": \"constructor\",\n",
      "          \"id\": [\n",
      "            \"langchain\",\n",
      "            \"schema\",\n",
      "            \"messages\",\n",
      "            \"AIMessage\"\n",
      "          ],\n",
      "          \"kwargs\": {\n",
      "            \"content\": \"我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。\",\n",
      "            \"response_metadata\": {\n",
      "              \"model_name\": \"qwen-flash\",\n",
      "              \"finish_reason\": \"stop\",\n",
      "              \"request_id\": \"13ebf016-61fd-45ea-815d-29c10bbad905\",\n",
      "              \"token_usage\": {\n",
      "                \"input_tokens\": 696,\n",
      "                \"output_tokens\": 106,\n",
      "                \"cached_tokens\": 0,\n",
      "                \"total_tokens\": 802\n",
      "              }\n",
      "            },\n",
      "            \"type\": \"ai\",\n",
      "            \"id\": \"run--84863fcd-ba75-4303-aed2-3de31feafd21-0\",\n",
      "            \"tool_calls\": [],\n",
      "            \"invalid_tool_calls\": []\n",
      "          }\n",
      "        }\n",
      "      }\n",
      "    ]\n",
      "  ],\n",
      "  \"llm_output\": {\n",
      "    \"model_name\": \"qwen-flash\"\n",
      "  },\n",
      "  \"run\": null,\n",
      "  \"type\": \"LLMResult\"\n",
      "}\n",
      "\u001b[36;1m\u001b[1;3m[chain/end]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain > chain:LLMChain] [1.33s] Exiting Chain run with output:\n",
      "\u001b[0m{\n",
      "  \"text\": \"我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。\"\n",
      "}\n",
      "\u001b[36;1m\u001b[1;3m[chain/end]\u001b[0m \u001b[1m[chain:RetrievalQA > chain:StuffDocumentsChain] [1.33s] Exiting Chain run with output:\n",
      "\u001b[0m{\n",
      "  \"output_text\": \"我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。\"\n",
      "}\n",
      "\u001b[36;1m\u001b[1;3m[chain/end]\u001b[0m \u001b[1m[chain:RetrievalQA] [1.60s] Exiting Chain run with output:\n",
      "\u001b[0m{\n",
      "  \"result\": \"我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。\"\n",
      "}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'我们相聚的意义在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚让我们感受到关怀、温暖与归属。在共同经历的喜怒哀乐中，我们互相理解、成长，也更加珍惜人与人之间真实而珍贵的关系。正是这些瞬间，让生命变得丰富、有温度，赋予我们前行的力量。所以，相聚的意义不在于时间的长短，而在于我们是否用心去爱、去倾听、去共同书写那些值得铭记的时刻。'"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qa.run(examples[0][\"query\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过LLM进行评估实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_35296/2300130425.py:3: LangChainDeprecationWarning: The method `Chain.apply` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~batch` instead.\n",
      "  predictions = qa.apply(examples)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "langchain.debug = False\n",
    "# 为所有不同的实例创建预测\n",
    "predictions = qa.apply(examples)\n",
    "# 对预测的结果进行评估\n",
    "# 导入QA问题回答，评估链\n",
    "from langchain.evaluation.qa import QAEvalChain\n",
    "\n",
    "eval_chain = QAEvalChain.from_llm(llm)\n",
    "# 在此链上调用evaluate 进行评估\n",
    "graded_outputs = eval_chain.evaluate(examples, predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Example 0: \n",
      "Question: 我们相聚的意义是什么？\n",
      "Real Answer: 相聚的意义在于创造美好的回忆和珍贵的关系\n",
      "Predicted Answer: 我们相聚的意义，在于创造美好的回忆，建立深厚的情感连接，彼此支持与陪伴。即使时光短暂，相聚的每一刻都能带来温暖、理解与成长。它让我们感受到被爱、被看见，也让我们在分享喜悦与面对困难时，更加懂得关怀与共情。相聚不仅是当下的陪伴，更是为彼此的生命增添意义和温度。正如那句“天下没有不散的筵席”，正因相聚短暂，才更值得珍惜——因为正是这些瞬间，让人生变得丰富而真实。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 1: \n",
      "Question: 咖啡是不是也可以叫豆浆?\n",
      "Real Answer: \n",
      "Predicted Answer: 不是，咖啡不能叫豆浆。\n",
      "\n",
      "虽然咖啡和豆浆都源自植物的种子（咖啡豆和黄豆），但它们在原料、制作工艺、味道和营养成分上完全不同：\n",
      "\n",
      "- **咖啡**：由咖啡豆烘焙后研磨，再通过冲泡提取而成。味道苦涩，含有咖啡因，具有提神作用。\n",
      "- **豆浆**：由黄豆浸泡、研磨、过滤后煮制而成，呈乳白色，味道清淡微甜，富含植物蛋白，不含咖啡因。\n",
      "\n",
      "因此，从科学和日常用语的角度来看，咖啡和豆浆是两种完全不同的饮品，不能互相替代或互称。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 2: \n",
      "Question: 根据文档内容，为什么即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光？请从多个方面详细说明。\n",
      "Real Answer: 即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光，原因如下：首先，相聚的意义在于创造美好的回忆和建立珍贵的关系；其次，相聚让我们感受到彼此的关怀、支持和友情；再次，相聚提供了分享喜悦、快乐和困难的机会，使我们能够在生活中互相支持和激励；此外，相聚也是一个促进相互了解、学习和成长的重要契机；最后，也是最重要的，相聚能带来真实的人际交往和情感交流，使我们深刻体会到生活的丰富与美好。因此，无论时间长短，我们都应珍视相聚的每一刻。\n",
      "Predicted Answer: 即使相聚的时光有限，我们仍然要珍惜与他人相聚的时光，原因可以从以下几个方面进行详细说明：\n",
      "\n",
      "1. **创造美好的回忆**  \n",
      "   相聚的时光虽然短暂，但正是这些时刻构成了人生中珍贵的记忆。无论是欢笑、感动，还是共同经历的困难与挑战，这些瞬间都会成为日后回想时温暖的情感依托。美好的回忆不仅丰富了个人的精神世界，也让人在面对孤独或困境时拥有心理支撑。\n",
      "\n",
      "2. **建立和维系深厚的人际关系**  \n",
      "   人与人之间的关系需要通过相处来培养和深化。即使时间有限，每一次相聚都是加深理解、增强信任的机会。这种情感联结能够带来归属感和支持感，使人感受到被接纳和关爱，从而提升幸福感和安全感。\n",
      "\n",
      "3. **获得情感支持与精神慰藉**  \n",
      "   在人生的低谷或迷茫时刻，亲朋好友的陪伴能提供强大的心理力量。相聚意味着有人愿意倾听、关心和鼓励你，这种情感交流是金钱和物质无法替代的。即使未来可能分离，当下的支持却能在关键时刻给予人继续前行的勇气。\n",
      "\n",
      "4. **促进自我成长与相互启发**  \n",
      "   与他人相聚不仅是情感交流，也是思想碰撞的过程。不同的人生经历、观点和价值观可以激发新的思考，帮助彼此拓宽视野、反思自我、实现成长。这种互动有助于形成更成熟的认知和更健全的人格。\n",
      "\n",
      "5. **体验真实的人际交往与生命温度**  \n",
      "   在数字化、快节奏的现代社会中，面对面的真实交流变得愈发珍贵。相聚让我们摆脱屏幕的隔阂，感受对方的眼神、语气和肢体语言，体会到“人在身边”的真实存在感。这种直接的情感连接让生活更加丰盈、有温度。\n",
      "\n",
      "6. **体现生命的意义与价值**  \n",
      "   正如文档中提到：“当我看到脚下先辈们铺好的路，才发觉人生的意义是为后人铺路。” 同理，我们与他人的相聚，也是一种传承与回馈——我们在当下付出感情与时间，也在为未来的联系埋下种子。这种“给予”本身就是意义的一部分。\n",
      "\n",
      "7. **回应“天下没有不散的筵席”的哲思**  \n",
      "   正因为相聚终将结束，才更凸显其珍贵。如果一切都能永恒，反而容易让人习以为常。短暂性恰恰赋予了相聚以紧迫感与仪式感，提醒我们要用心对待每一刻，不让遗憾留下。\n",
      "\n",
      "综上所述，尽管相聚的时间有限，但其带来的情感价值、精神滋养、成长契机和生命意义远超时间本身。因此，无论未来如何，我们都应珍惜当下每一次相遇，因为正是这些短暂而真挚的时光，构成了人生最动人的篇章。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 3: \n",
      "Question: 为什么咖啡不能被称为豆浆？请从制作过程、成分、味道和功能四个方面进行详细说明。  \n",
      "Real Answer: 咖啡不能被称为豆浆，原因如下：首先，在制作过程上，咖啡是将咖啡豆研磨后通过冲泡方式提取出的饮品，而豆浆则是将黄豆浸泡后研磨并过滤掉固体渣滓所得到的植物性液体；其次，在成分方面，咖啡含有咖啡因，具有提神醒脑的作用，而豆浆不含咖啡因，富含植物蛋白质；再次，在味道上，咖啡通常带有明显的苦味，而豆浆味道较为清淡，带有豆类的天然香气；最后，在功能上，咖啡主要用于提神和提供能量，而豆浆则是一种适合素食者或乳制品过敏者的营养替代饮品。因此，尽管两者都由豆类制成，但在制作工艺、化学成分、口感体验和生理功能上均有显著差异，故咖啡不能被称为豆浆。\n",
      "Predicted Answer: 咖啡不能被称为豆浆，原因可以从**制作过程、成分、味道和功能**四个方面进行详细说明：\n",
      "\n",
      "---\n",
      "\n",
      "### 一、制作过程不同\n",
      "\n",
      "- **咖啡**：  \n",
      "  咖啡的制作始于**咖啡豆**（咖啡植物的种子），经过**烘焙**（高温处理使豆子产生香气和风味）、**研磨**成粉，再通过**萃取**方式（如手冲、意式浓缩、滴滤等）用水高温冲泡提取出液体。整个过程强调的是**热萃取**和**烘焙带来的化学变化**。\n",
      "\n",
      "- **豆浆**：  \n",
      "  豆浆以**黄豆**为原料，首先需要将黄豆**浸泡**数小时至一夜，然后**研磨**成浆，接着**过滤**去除豆渣，最后**煮沸**杀菌并稳定口感。其核心是**物理加工与加热**，不涉及烘焙或高温萃取。\n",
      "\n",
      "👉 **关键区别**：咖啡依赖于**烘焙+萃取**，而豆浆依赖于**浸泡+研磨+过滤+煮沸**，两者工艺本质完全不同。\n",
      "\n",
      "---\n",
      "\n",
      "### 二、成分差异显著\n",
      "\n",
      "- **咖啡**：  \n",
      "  主要成分包括**咖啡因**（具有提神作用）、**绿原酸**（抗氧化物质）、**芳香化合物**（如醛类、酮类）、少量脂肪和碳水化合物。其营养成分以生物活性物质为主，蛋白质含量极低。\n",
      "\n",
      "- **豆浆**：  \n",
      "  主要成分是**植物性蛋白质**（约3–4%）、**大豆异黄酮**（类似雌激素的植物化合物）、**卵磷脂**、**膳食纤维**以及少量碳水化合物。不含咖啡因，富含优质植物蛋白。\n",
      "\n",
      "👉 **关键区别**：咖啡的核心是**咖啡因和芳香物质**，而豆浆的核心是**蛋白质和植物营养素**，两者在化学构成上没有交集。\n",
      "\n",
      "---\n",
      "\n",
      "### 三、味道截然不同\n",
      "\n",
      "- **咖啡**：  \n",
      "  味道以**苦味**为主导，伴随**酸度**、**醇厚度**和复杂的香气（如坚果、巧克力、焦糖、花香等），取决于烘焙程度和产地。整体风味强烈且刺激。\n",
      "\n",
      "- **豆浆**：  \n",
      "  味道偏**豆腥味**或**微甜**，有天然的豆类清香，质地顺滑，通常带有轻微的“豆乳感”。部分产品会添加糖或香精改善口感，但本质是**清淡的豆奶味**。\n",
      "\n",
      "👉 **关键区别**：咖啡是“苦中带香”，豆浆是“淡中带甜”，两者的味觉体验完全不重合。\n",
      "\n",
      "---\n",
      "\n",
      "### 四、功能用途完全不同\n",
      "\n",
      "- **咖啡**：  \n",
      "  主要功能是**提神醒脑**，依靠咖啡因刺激中枢神经系统，提升警觉性和专注力。常用于工作、学习或社交场合，是一种功能性饮品。\n",
      "\n",
      "- **豆浆**：  \n",
      "  主要功能是**营养补充**，尤其适合素食者、乳糖不耐受人群作为牛奶替代品，提供蛋白质、钙和植物雌激素，有助于维持身体机能。\n",
      "\n",
      "👉 **关键区别**：咖啡是“功能性刺激饮品”，豆浆是“营养性替代饮品”，目的和作用机制完全不同。\n",
      "\n",
      "---\n",
      "\n",
      "### 结论：\n",
      "\n",
      "虽然咖啡和豆浆都源自“豆类”（咖啡豆和黄豆），但它们在**制作工艺、化学成分、感官体验和生理功能**上均无共同点。因此，从科学和语言规范的角度看，**咖啡绝不能被称为豆浆**，这就像把苹果叫橙子一样不合逻辑。\n",
      "\n",
      "> ✅ 正确说法：  \n",
      "> - 咖啡 ≠ 豆浆  \n",
      "> - 植物性饮品 ≠ 同一类饮品  \n",
      "> - 即使原料都来自豆类，也不能混淆品类。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 4: \n",
      "Question: 为什么石油虽然也是一种油，但不能用于炒菜？请从化学成分、毒性、风味气味以及燃点四个方面进行详细解释。  \n",
      "Real Answer: 石油不能用于炒菜，主要原因如下：第一，化学成分不同，食用油主要由植物或动物脂肪制成，富含对人体有益的脂肪酸（如欧米伽脂肪酸），而石油是化石燃料，主要成分为碳氢化合物，并含有多种有害化学物质；第二，石油具有毒性，其中含有的化学物质对人体有害，甚至可能致癌，且在加热时会释放有毒烟雾和蒸气，严重危害健康；第三，石油具有强烈且令人不悦的气味和味道，无法为食物增添美味，反而会污染食物；第四，石油的燃点远低于食用油，在较低温度下就容易燃烧，这在厨房环境中极易引发火灾，存在极大的安全隐患。因此，出于健康和安全的考虑，石油绝不能用于烹饪，只有专门设计的食用油才适合用于食品加工。\n",
      "Predicted Answer: 石油虽然在广义上属于“油”类物质（即液态的有机物），但它**绝对不能用于炒菜**，原因可以从化学成分、毒性、风味气味以及燃点四个方面进行详细解释：\n",
      "\n",
      "---\n",
      "\n",
      "### 一、化学成分：本质完全不同\n",
      "\n",
      "- **食用油**：主要由甘油三酯构成，即甘油与三种脂肪酸（如油酸、亚油酸、棕榈酸等）形成的酯类。这些成分是人体可代谢的营养物质，属于天然生物油脂。\n",
      "  \n",
      "- **石油**：是一种复杂的混合物，主要由**碳氢化合物**（如烷烃、环烷烃、芳香烃等）组成，还含有硫化物、氮化物、重金属杂质等。它不是生物来源，而是远古生物遗骸经数百万年地质作用形成的化石燃料。\n",
      "\n",
      "> ✅ 结论：食用油是“可食用”的生物脂类，而石油是“不可食用”的工业燃料，两者化学结构和来源天差地别。\n",
      "\n",
      "---\n",
      "\n",
      "### 二、毒性：含多种致癌物和有害物质\n",
      "\n",
      "- 石油中包含大量**有毒甚至致癌物质**，例如：\n",
      "  - 苯（Benzene）——强致癌物\n",
      "  - 芳香烃（如甲苯、二甲苯）\n",
      "  - 多环芳烃（PAHs，如苯并芘）\n",
      "  - 硫化物和重金属（如铅、汞、砷）\n",
      "\n",
      "这些物质一旦进入人体，可能造成：\n",
      "- 急性中毒（恶心、呕吐、头晕）\n",
      "- 慢性损害（肝肾损伤、神经系统障碍）\n",
      "- 增加癌症风险（尤其是消化道癌）\n",
      "\n",
      "> ✅ 结论：石油中的化学成分对人体具有严重毒性和致癌性，绝不能作为食品使用。\n",
      "\n",
      "---\n",
      "\n",
      "### 三、风味与气味：刺鼻难闻，无法接受\n",
      "\n",
      "- 食用油在加热后通常能释放出香味（如花生油的焦香、橄榄油的果香），这是由脂肪酸氧化或热解产生的挥发性香气物质。\n",
      "  \n",
      "- 石油则散发出**强烈的刺鼻、发臭的煤油味或汽油味**，其挥发性物质包括苯、甲苯等，不仅难闻，而且会刺激呼吸道和眼睛。\n",
      "\n",
      "> ✅ 结论：石油的气味和味道完全不适合食物，会彻底破坏菜肴的感官体验，甚至引发呕吐或中毒反应。\n",
      "\n",
      "---\n",
      "\n",
      "### 四、燃点极低，极易引发火灾\n",
      "\n",
      "- **食用油的燃点**一般在 **200°C～250°C** 之间（如花生油约230°C，大豆油约220°C），这正是日常炒菜的常见温度范围。\n",
      "  \n",
      "- **石油的燃点**极低，约为 **40°C～60°C**，有些组分甚至在常温下就能挥发形成可燃气体。一旦加热，瞬间就会产生易燃蒸气，极易发生爆炸或火灾。\n",
      "\n",
      "> ⚠️ 实际例子：将石油倒入锅中加热，还未到100°C，就可能因蒸气遇明火而爆燃，造成严重安全事故。\n",
      "\n",
      "> ✅ 结论：石油的低燃点使其在厨房环境中极其危险，根本无法安全使用。\n",
      "\n",
      "---\n",
      "\n",
      "### ✅ 总结对比表：\n",
      "\n",
      "| 方面         | 食用油                     | 石油                         |\n",
      "|--------------|----------------------------|------------------------------|\n",
      "| 化学成分     | 甘油三酯（脂肪酸+甘油）    | 碳氢化合物 + 有毒杂质        |\n",
      "| 是否可食用   | 是                         | 否（剧毒）                   |\n",
      "| 有害物质     | 无                         | 含苯、多环芳烃、重金属等     |\n",
      "| 气味与风味   | 可增加香味                 | 刺鼻恶臭，不可接受           |\n",
      "| 燃点         | 200°C以上                  | 40°C～60°C（极易燃烧）       |\n",
      "| 安全性       | 高（专为烹饪设计）         | 极低（极度危险）             |\n",
      "\n",
      "---\n",
      "\n",
      "### 📌 最终结论：\n",
      "\n",
      "尽管石油在物理形态上是“油”，但它的**化学本质、毒性、气味和安全性都与食用油截然相反**。它不仅是**有毒、致癌、易燃**的工业原料，而且对健康和生命构成严重威胁。因此，**绝对不能用于炒菜**，也绝不能作为任何食品的替代品。\n",
      "\n",
      "> 🔒 安全提示：切勿将石油、汽油、煤油等工业油品误作食用油使用，一旦误食或误用，后果极为严重。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 5: \n",
      "Question: 冥婚作为一种中国传统习俗，其性质为何具有矛盾性？请结合文档内容，从仪式形式与实际意义两个方面进行解释，并说明在不同地区人们对冥婚的看待方式有何差异。\n",
      "Real Answer: 冥婚的性质具有矛盾性，主要体现在其仪式形式与实际意义之间的冲突。从仪式形式上看，冥婚是一种婚礼，具有传统婚礼的特征，如举行仪式、交换信物等，因此表面上与“红事”相关联，属于喜庆的范畴。然而，从实际意义来看，冥婚的对象是已故的未婚男女，其目的是为了使死者的灵魂在阴间有伴侣相伴，以求得安宁，这显然与死亡相关，因而又与“白事”紧密相连。因此，冥婚在本质上兼具“红事”的仪式形式和“白事”的哀悼目的。\n",
      "Predicted Answer: 冥婚作为一种中国传统习俗，其性质具有矛盾性，主要体现在**仪式形式**与**实际意义**两个方面，这种矛盾性也导致了不同地区人们对冥婚的看待方式存在差异。\n",
      "\n",
      "### 一、仪式形式上的“红事”属性\n",
      "\n",
      "从仪式形式上看，冥婚本质上是一种婚礼。它遵循传统婚礼的流程，如提亲、订婚、迎亲、拜堂等，甚至会使用红色喜服、举行宴席（有时为象征性），整体氛围与“红事”相似。这种形式上的喜庆色彩，使冥婚在表面上被归类为“红事”，即一种带有祝福与吉祥意味的庆典活动。\n",
      "\n",
      "### 二、实际意义上的“白事”属性\n",
      "\n",
      "然而，从实际意义来看，冥婚的对象是已故之人，其核心目的是为了安抚死者的灵魂，使其在阴间不孤单，避免成为“孤魂野鬼”。这一目的与死亡、丧葬密切相关，因此冥婚在实质上属于对逝者的祭祀或超度行为，具有浓厚的哀悼与宗教意味，这使其更接近“白事”。\n",
      "\n",
      "这种**形式喜庆而本质哀伤**的反差，构成了冥婚性质的内在矛盾：它既是“结婚”的喜事，又是“丧事”的延续。\n",
      "\n",
      "### 三、地区看待方式的差异\n",
      "\n",
      "由于文化背景、地域信仰和家庭观念的不同，人们对冥婚的看法也存在显著差异：\n",
      "\n",
      "- **部分地区视其为“白事”**：在一些传统观念较重的农村地区，人们认为冥婚是对亡者的一种慰藉，是完成其“人生使命”的补救措施。因此，家庭往往以严肃、哀悼的态度对待，不办热闹的婚礼，甚至避免公开庆祝，强调的是对死者的尊重与安魂。\n",
      "\n",
      "- **部分地区则赋予其“红事”色彩**：在某些地方，尤其是历史上有冥婚传统的区域（如福建、广东部分地区），冥婚被视为一种“成全姻缘”的善举，甚至带有“圆满姻缘”的美好寓意。在这种观念下，婚礼仪式可能仍保留部分喜庆元素，如贴红联、放鞭炮，意在为亡者“配对”并祈求平安。\n",
      "\n",
      "### 结论\n",
      "\n",
      "综上所述，冥婚的矛盾性源于其**仪式形式的喜庆性**与**实际意义的哀悼性**之间的冲突。这种双重属性使得它既可被看作“红事”，也可被归为“白事”，而不同地区的文化传统和信仰体系决定了人们对它的具体态度——有的侧重于安魂祭奠，有的则强调姻缘圆满。正是这种复杂性，使冥婚成为中国民俗中极具象征意义又充满争议的特殊现象。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n",
      "Example 6: \n",
      "Question: 根据文档内容，当事人在执行死刑时是否可以委托律师作为代理人参与执行过程？请结合民法典的相关规定和刑事执行程序的特殊性进行解释。  \n",
      "Real Answer: 根据文档内容，当事人在执行死刑时不可以委托律师或其他代理人参与执行过程。虽然《民法典》规定当事人可以委托一至二人作为代理人，但这种代理关系仅适用于民事事务，如合同签订、财产管理、民事诉讼等。而执行死刑属于刑事执行程序，具有高度的严肃性和国家强制性，由国家授权的专门机关依法进行，不允许私人代理参与。因此，即使当事人委托律师，也无法在死刑执行环节中代表其到场或代为执行，因为该程序不适用民法典中关于代理的规定。\n",
      "Predicted Answer: 根据文档内容，当事人在执行死刑时**不可以委托律师作为代理人参与执行过程**。\n",
      "\n",
      "理由如下：\n",
      "\n",
      "1. **民法典规定的代理适用范围有限**：  \n",
      "   《民法典》确实规定当事人可以委托一至二人作为代理人处理民事事务（如合同签订、财产管理、诉讼等），但这仅适用于**民事法律关系**中的代理行为。而死刑执行属于**刑事司法程序**的组成部分，涉及国家刑罚权的实施，不属于民法调整范畴。\n",
      "\n",
      "2. **刑事执行程序具有高度特殊性和法定性**：  \n",
      "   死刑的执行是由国家授权的专门机关依法进行的强制性行为，其程序严格遵循《刑事诉讼法》及相关法律规定。执行过程由司法机关主导，不允许任何私人代理介入。即使当事人有意愿或委托律师，也无法改变这一程序的法定属性。\n",
      "\n",
      "3. **执行死刑的本质是国家行为，非个人可代理事项**：  \n",
      "   死刑执行不是一种“需要代理”的民事行为，而是对已定罪罪犯施加刑罚的国家行为。它不涉及当事人的意思表示或权利处分，因此不存在“委托代理人”参与执行的可能性。\n",
      "\n",
      "综上所述，尽管《民法典》允许民事代理，但死刑执行属于刑事执行程序，具有不可代理性。因此，当事人不能委托律师或其他代理人参与死刑的执行过程。\n",
      "Predicted Grade: GRADE: CORRECT\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for i, eg in enumerate(examples):\n",
    "    print(f\"Example {i}: \")\n",
    "    print(f\"Question: \" + predictions[i][\"query\"])\n",
    "    print(f\"Real Answer: \" + predictions[i][\"answer\"])\n",
    "    print(f\"Predicted Answer: \" + predictions[i][\"result\"])\n",
    "    print(\"Predicted Grade: \" + graded_outputs[i]['results'])\n",
    "    print()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
